package com.aq.lock;

/**
 * 死锁：多个线程互相抱着对方需要的资源，然后形成僵持
 */
public class DeadLock {

    public static void main(String[] args) {
        Makeup gir1 = new Makeup(0, "灰姑娘");
        Makeup gir2 = new Makeup(1, "白雪公主");
        gir1.start();
        gir2.start();
    }
}

// 口红
class Lipstick {
}

// 镜子
class Mirror {
}

class Makeup extends Thread {

    // 需要的资源只有一份，用static来保证 只有一份
   Lipstick lipstick = new Lipstick();
   Mirror mirror = new Mirror();

    int choice; // 选择
    String girName; // 使用化妆品的人

    public Makeup(int choice, String girName) {
        this.choice = choice;
        this.girName = girName;
    }

    @Override
    public void run() {
        // 化妆
        makeup();
    }

    // 化妆，互相持有对方的锁，就是需要拿到对方的资源
    private void makeup() {
        if (choice == 0) {
            synchronized (lipstick) { // 获得 口红的锁
                System.out.println(this.girName + "获得口红的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (mirror) { // 一秒钟后，想要获得镜子
                System.out.println(this.girName + "获得镜子的锁");
            }
        } else {
            synchronized (mirror) { // 获得 口红的锁
                System.out.println(this.girName + "获得镜子的锁");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (lipstick) { // 一秒钟后，想要获得镜子
                System.out.println(this.girName + "获得口红的锁");
            }
        }

    }

}